Repository navigation
Profile v3: enterprise kinds, shared OOP prompt, secrets rule, linear fact counters - #269
Open
bernardladenthin wants to merge 28 commits into
Open
bernardladenthin wants to merge 28 commits into
bernardladenthin wants to merge 28 commits into
Conversation
…rkup The [ignore] line of xml-facts scanned to the end of the file again from every comment, CDATA section, processing instruction or DOCTYPE that is never closed (100 KB of unclosed "<?" took 8.4 s; an unclosed internal subset repeated ran for minutes), the XSD counter from every unclosed type tag, and pom-facts likewise from every unclosed comment, CDATA section and <plugin>. An unclosed region now runs to the end of the file, as in sql-facts; a type tag ends at the next "<"; a nested plugin body at the next plugin tag. Well-formed files count as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…enerateOnProfileChange) A file summary's header has recorded the prompt (P) and fact counters (N) it was written with since 1.4.0, but only a changed source, aiVersion or force rewrote it. shouldWrite now compares P and N too, unless srcMorph.regenerateOnProfileChange is false, which records them only. The default is true. The plugin README's header section says what rewrites a summary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…hree more ProfileFactPatternsLinearityTest runs every pattern of every facts file of the profile over 55 repeated adversarial lines and counts the characters the matcher reads: four times the input may read at most six times as many. It is exact on any machine. Against the 1.4.0 files it reports six quadratic patterns; besides the XML and POM ones fixed before, the Java type arguments and field initializer read across lines to the end of the file, and the shell dash-option arms backtracked over blanks. Type arguments are now read within one line, an initializer up to 10,000 characters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
fileNames (under srcMorph and as a condition leaf) selects and routes files by name, so a
Dockerfile or Jenkinsfile without an extension can be indexed. contentMatches routes by a Java
regular expression found in the first 16,384 characters of a file, so Kubernetes, OpenAPI and
Camel YAML take different rules; planning reads only that start unless it reads the whole file.
Every glob takes {a,b} alternatives (support.AiGlob, shared by excludes, pathGlob and fileNames).
A source file is decoded without its byte order mark, and as UTF-16 when it carries that one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…secrets rule Profile v3 gets file-body-oop (one prompt for Java, Kotlin, Groovy, Scala), file-body-view (JSP, Facelets), file-body-contract (OpenAPI, AsyncAPI, Protobuf, ...) and file-body-ops (CI, Docker, Kubernetes, Helm, Terraform), and fifteen fact files: kotlin, groovy, java-ee, jee, persistence, mybatis, integration, bpmn, wsdl, jsp, facelets, openapi, k8s, actions and dockerfile. The XML prompt defines the EE descriptors, mappings, routes, BPMN and WSDL. A facts file can include another ([include]<TAB><key>), so jee-facts is xml-facts plus its own counters and java-ee-facts is java-facts plus the annotations, without a copied line. Every file prompt names a secret and never copies its value, and the self-test and the examples skip the files that hold credentials. Four test classes pin every new counter; the linearity test measures all of them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
The Luna example routes Java with Jakarta EE imports, Kotlin, Groovy, Scala, the EE descriptors, JPA/Hibernate and MyBatis mappings, integration routes, BPMN, WSDL, JSP, Facelets, OpenAPI, other contracts, GitHub Actions, Kubernetes, Dockerfiles and other YAML to their prompt and counters; ExamplesConfigBindingTest routes one file of every kind. run.py routes the same kinds and takes --java-prompt, so the Java prompt and the shared OOP prompt can be measured side by side; score.py counts a summary that copies a secret the facts mark. docs/ai-index-benchmark/corpus-enterprise holds one or two files per kind with facts-enterprise.json. SpotBugs: an [include] needs the profile directory, a resolver interface with a generic exception replaces the unchecked wrapper, and GenerateEngine.run hands its log lines and the indexer to two methods. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
… Camel YAML in the Luna example The Luna example indexes .gradle (fallback prompt) and routes Camel's YAML DSL (- route:, - from:) to the ops prompt. TODO.md lists what is open: the measurement, Java on the shared prompt, push and pull request, selection by shebang, the kinds without counters, DMN, Gradle and scripts, pathGlob's case, java-facts without an ignore line, and the review findings not proposed yet. CHANGELOG and profiles README follow the branch; the README says that blanking leaves a space. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…of 2026-11-04 Three runs each of gpt-oss-20b and GPT-6 Luna on the model-card corpus with file-body-java and with file-body-oop gave the same Java recall (Luna 100 % in all three with the shared prompt), so Java moves to file-body-oop everywhere and file-body-java.md goes. The language corpus after the secrets rule: Luna 99.8 %, gpt-oss 98.7 % (99.1 % before, within the noise of three runs). The enterprise corpus: 97.9 % and 97.3 %, no summary copied its password. Outputs and metadata under docs/ai-index-benchmark/remeasure-2026-11-04/; TODO.md keeps what the runs left open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
bernardladenthin
had a problem deploying
to
startgate
November 4, 2026 08:45 — with
GitHub Actions
Error
WalkthroughWarning Review details and warnings were omitted to fit the comment limit. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…] and [distinct] counters, a time limit for fact patterns - fileInterpreters (srcMorph) and the interpreters condition: a file without an extension whose #! line names one of the interpreters, or a version of one, is indexed and routed (support.AiShebang; the line is read only after the subtree, exclude and size filters). - contentHeadChars (srcMorph, default 16,384): how much of a file contentMatches and interpreters read. - [raw] counts the source before the [ignore] lines blank it, [distinct] the different texts a pattern matched (its first group where it took part); a summary written before keeps its facts hash. - Every fact pattern may read 2,000 characters per character of the source plus 1,000,000: past that its counter is left out (an ignore counter blanks nothing) and a warning names it. - SourceFileIndexer is final; AiShebang and AiFactExtractor$ReadBudget are on the PIT gate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…, java-facts without comments and strings - New facts files: scala, proto, avro, graphql, asyncapi, terraform (OpenTofu, Terragrunt), ansible, compose, camel-yaml, dmn (inputs, outputs, rules, hit policies), gradle, properties, powershell, batch. The YAML ones blank a block scalar's body from the indentation of its first line and keep its key. ContractFactPatternsTest, OpsFactPatternsTest and JvmFactPatternsTest pin each. - java-facts: an [ignore] line for comments, Javadoc, text blocks and literals; TODO/FIXME is [raw]. - bpmn-facts counts BPMN only; DMN goes to dmn-facts. - The Luna example and run.py route the new kinds; java-ee also by an annotation written with its package; shell and Perl also by the #! line (fileInterpreters). - The linearity test repeats 110 adversarial lines and asserts no pattern reaches the time limit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…b keeps its case; TODO for the measurement Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…ivate helpers, the ops prompt names a workflow and defines Gradle - The file phase heads the user message with the path below the base directory, so two web.xml of different modules read apart (AiPromptSupport: a relative path whole with "/", an absolute one by its name); the plan's window check counts the same line. Every file prompt says so. - file-body-oop: name the private functions, constants and fields the logic uses and each call on a dependency. file-body-ops: a CI workflow's or pipeline's name; Gradle build and settings scripts. - PIT: the time-limit warning is asserted, AiShebang reads its words with \G so no equivalent boundary is left, and versions with 0 and 9 are tested. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…tion and the blanking it inherits Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…hat is open remeasure-2026-11-04b: gpt-oss-20b and GPT-6 Luna on OpenRouter at 51fcd23. Enterprise corpus 99.7 / 99.9 % (97.9 / 97.3 % before), every name the morning's runs left out found in all six runs; card corpus 99.5 % over six gpt-oss runs and 100 % for Luna; language corpus 99.0 % over nine gpt-oss runs (the morning's 98.7 % was variation) and 99.5 % for Luna. No failed file, fence, ### heading or leaked secret. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
- terraform-facts: a reference on a line of its own (module.network, data.x.y in depends_on) is no block; powershell-facts: Verb-Noun names with an inner capital (ForEach-Object, ConvertTo-Json); asyncapi-facts: an address counts only with a value on its line, not a schema property; batch-facts: for /r with an unquoted root; camel-yaml's REST counter is labelled as verb blocks; scala-facts says how deep its comments nest. - AiShebang reads env's -u / -C arguments and its -S / --split-string= command line. - SourceFileIndexer skips an extensionless file it cannot read, with a warning; contentHeadChars is at least 256 (a whole #! line) and the head buffer never exceeds the file. - Docs: run.py's routing, the DMN test, contentHeadChars, the final indexer and its log lines. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
… the project record P, M and K - regenerateOn under srcMorph (source, prompt, facts, model, children; each true by default) replaces regenerateOnProfileChange; force rewrites every summary whatever they say. Each switch compares one header field: C, P, N, and the new M (model: definition key, remoteModel, model file name) and K (the child summaries a package or the project is written from). A missing or empty summary, another H, X, title or aiVersion rewrite always; a field not recorded counts as changed. - A package is rewritten when a file is re-summarized over an unchanged source (K), and when its own prompt or model changed; the project likewise, its checksum now its packages alone. - AiHeaderHashes (indexer) holds the prompt, model and children hashes; AiMdHeaderSupport takes one boolean per field (document may not see config). Every example YAML shows the switches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…rectory, M:/Modelle Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…he prompt hash reads LF The project's C was the CRC32 of its package links only, so with regenerateOn.children off a changed source rewrote its file and package but not the project, which kept the package's old lead. C is now built from link, C and X of every package, as a package's C is built from its children. The prompt hash read the prompt files as written, so a profile checked out with CRLF on one machine and LF on another rewrote every summary on each change of side; it now reads line endings as the source checksum does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…ries; regenerateOn in every phase's log The CHANGELOG said a first run with the switches off keeps the old summaries; it only postpones the rewrite, since a field is recorded only when its summary is written. A new "Upgrading from 1.4.0" says so and lists the constructor and method changes of the library. The aggregate engines log regenerateOn as the file phase does; two Javadocs said "below 1" for the bound 256 and "freezes the index" without saying against what. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…he Luna example's kinds, the routing example's prompts The READMEs, the Windows walkthrough and build-your-own-jar said the examples need 1.4.0, which rejects their keys and facts markers; they now say the next release or a reactor build, and which tag holds the examples of 1.4.0 and 1.3.0. CONTRIBUTING.md described JUnit 4, Maven's Log in the library, CI on Java 8 and records; the copilot gateway page listed the Luna example's kinds before the enterprise ones; the plugin README's routing example named two prompts no profile has; the PIT badge counted 78 classes (83); the codec's Javadoc lacked the hashes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…options, versions end at a dot, contentMatches under a read budget fileNames under srcMorph took a name with a / silently, which never matched; the condition of the same name rejected it. Both now compile a name through AiConditionEvaluator.compileFileName. The #! reader skips the arguments of GNU env -a/--argv0 and BSD env -P/-L/-U too (#!/usr/bin/env -P /usr/local/bin bash read "bin"), and a name ending with a digit matches a version only from a dot on (python3.1 matched python3.12). contentMatches is compiled once per pattern and reads under a fact pattern's read budget: one that backtracks past it matches nothing, with a warning, instead of hanging the plan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
… defined twice fails the run Windows PowerShell 5.1 writes UTF-8 with a byte order mark, which Jackson read as a character before the first brace, so such a JSON configuration did not load; the loader decodes the file the way the source reader does. aiDefinitions, promptDefinitions and factDefinitions took a key defined twice silently, the last one winning; the registries now fail naming the list, the index and the key. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…RVER or the PATH Both named llama-server.exe by a local user profile path; it is LLAMA_SERVER now, the PATH by default, and the model directory MODELDIR (default M:/Modelle). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…here
Blanking left a space for a region within one line, also at a line start, so a counter anchored
there (^class, ^import, Perl's ^my) missed the code after a leading comment: /* x */class A {}
counted no type. A region at the start of a line now leaves nothing; within a line it still leaves a
space.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…sion Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
…dentity; cheaper test first in the blanking Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad
|
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Summary
regenerateOn(one switch per header field next toforce),fileNames/contentMatches/{a,b}globs / BOM,[include]for facts files.file-body-oopfor Java, Kotlin, Groovy and Scala (replacesfile-body-java), view, contract and ops prompts, and fact counters for every kind it routes (29 new facts files in all).#!line; fact counters gain[raw],[distinct]and a time limit; the model reads a file's path, not its name alone.Fixes
xml-facts,pom-facts(100 KB of unclosed<?took 8.4 s; an unclosed DOCTYPE subset ran for minutes), plus three more the new test found: the Java type arguments and field initializer, the shell option arms. Unclosed regions now run to the end of the file.ProfileFactPatternsLinearityTestmeasures every pattern of every facts file over 110 adversarial lines by counting the characters the matcher reads (4× input ≤ 6× reads), exact on any machine, and asserts that no pattern reaches the new time limit.***for its value. The self-test and the examples skip.env,*.tfvars,*.tfstate, Mavensettings.xml, keys,*secret*/*credential*configuration.Engine
regenerateOn(breaking, replacesregenerateOnProfileChange): one switch per cause next to the globalforce:source(C),prompt(P),facts(N),model(newM: definition key,remoteModel, model file name),children(newK: the child summaries a package or the project reads), eachtrueby default. A missing/empty summary, anotherH,X, title oraiVersionrewrite always. Packages and the project now recordP,M,Ktoo, so a package is rewritten when its files were re-summarized over unchanged sources (was a gap: itsCis built from the children's source checksums). Every example YAML shows the switches.fileNames(selection and condition) for files without an extension;contentMatches;{a,b}in every glob (support.AiGlob); BOM / UTF-16 decoding.fileInterpreters(selection) and theinterpreterscondition: a file without an extension whose#!line namesbash,perl,python(or a version) is indexed and routed (support.AiShebang,envoptions read asenvreads them; an unreadable file is skipped with a warning).contentHeadChars(default 16,384, at least 256): how muchcontentMatches/interpretersread; never past the file's end.[include]<TAB><key>;[raw]counts before the[ignore]blanking,[distinct]counts different names; every pattern may read 2,000 characters per character plus 1,000,000, past that its counter is left out with a warning (the profile's patterns read at most ~830).web.xmlof different modules read apart.SourceFileIndexeris final (constructor gained two parameters).Review of 2026-11-04 (the delta and the whole repository)
Cfolds every package'sC, so a changed source rewritesproject.ai.mdalso withregenerateOn.children: false(it kept the old lead).Preads LF: a profile checked out with CRLF on one machine and LF on another no longer rewrites every summary on each change of side.fileNamesentry with a/fails the run undersrcMorphtoo; the#!reader skips the arguments of GNUenv -aand BSDenv -P/-L/-U, andpython3.1no longer matchespython3.12;contentMatchesis compiled once and reads under the fact patterns' read budget.aiDefinitions,promptDefinitionsorfactDefinitionsfails the run (breaking: it was taken silently, the last one winning).[ignore]region at the start of a line leaves nothing there, so^classcounts/* x */class A.docs/copilot-api-gateway.md; the plugin README's routing example names existing prompts; PIT badge 83 classes. The agentic benchmark scripts takellama-serverfromLLAMA_SERVERor thePATHinstead of a local path; one model directoryM:/Modelle.Gin the plugin, an escape for${...}, one rate-limit window per server.Profile v3
file-body-oopfor Java, Kotlin, Groovy, Scala — replacesfile-body-java(breaking: a rule namingfile-body-javamust namefile-body-oop). It now names private helpers, constants and calls on dependencies too.file-body-view,file-body-contract,file-body-ops(a workflow's name, Gradle scripts); the XML prompt defines EE descriptors, mappings, routes, BPMN, DMN, WSDL.java-factsnow skips comments and strings (TODO/FIXMEis[raw]).examples/copilot-api-gateway/srcmorph-luna.yamlroutes every kind;pathGlobkeeps matching in the case written (decided, documented).Measurement (OpenRouter)
docs/ai-index-benchmark/remeasure-2026-11-04/(3 runs each) and, after the prompt changes,remeasure-2026-11-04b/:file-body-javafile-body-oopThe names the first enterprise runs left out (
release-backoffice,nextNumber,PREFIX,refund) are named in all six later runs. No summary copied the corpus's password, no fence, no###heading, no failed file.Test plan
mvn installreactor green (core 2092 tests, CLI 74, plugin 58), SpotBugs clean, PIT core 1896/1896,.github/plugin-it.shpassed locally, benchmark tool tests 48/48,reuse lintcompliantenvoptions, unreadable files,contentHeadCharsbounds, docs)Related issues / PRs
Refs #268
Checklist
CONTRIBUTING.mdandCODE_OF_CONDUCT.md🤖 Generated with Claude Code
https://claude.ai/code/session_01DuAkLtHrCTx81vP5Mt4jad